package com.anlu.base.model;

import jakarta.annotation.Nullable;
import lombok.Data;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

@Data
public class Ret<T> {
    private String code;
    private String msg;
    //temp 方便分析问题
    private String cause;
    private T data = null;

    public Ret() {
    }

    public Ret(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public void setData(T data) {
        if (null != data) {
            this.data = data;
        }
    }

    public T getData() {
        if (null == data) {
            return (T) new HashMap<>();
        }
        return data;
    }


    public static <T> Ret of(String code, String msg, T data) {
        Ret<T> ret = new Ret<>();
        ret.setCode(code);
        ret.setMsg(msg);
        if (null != data) {
            ret.setData(data);
        }
        return ret;
    }




    public static <T> Ret fail(String code, String msg, T data) {
//        RequestInfo requestInfo = RequestContext.getRequestInfo();
//        requestInfo.setErrCode(code);

        Ret<T> ret = new Ret<>();
        ret.setCode(code);
        ret.setMsg(msg);
        if (null != data) {
            ret.setData(data);
        }
        return ret;
    }

    public static <T> Ret fail(String code, String msg) {
//        RequestInfo requestInfo = RequestContext.getRequestInfo();
//        requestInfo.setErrCode(code);

        Ret<T> ret = new Ret<>();
        ret.setCode(code);
        ret.setMsg(msg);

        return ret;
    }

    // public boolean dataIsEmpty() {
    //     switch (data) {
    //         case null -> {
    //             return true;
    //         }
    //         case Collection collection -> {
    //             return collection.isEmpty();
    //         }
    //         case Map map -> {
    //             return map.isEmpty();
    //         }
    //         default -> {
    //         }
    //     }
    //     if (data.getClass().isArray()) {
    //         return Array.getLength(data) == 0;
    //     }
    //     return false;
    // }
    //
    // public boolean dataNotEmpty() {
    //     return !dataIsEmpty();
    // }

    /**
     * 方法描述：获取数据，可能为null
     *
     * @return T
     * @author 赵希坤
     * @date 日期：2024/9/20 时间：18:32
     */
    @Nullable
    public T data() {
        return data;
    }

    /**
     * 方法描述：获取数据，可能为null
     *
     * @return T
     * @author 赵希坤
     * @date 日期：2024/9/20 时间：18:32
     */
    public Optional<T> dataOptional() {
        return Optional.ofNullable(data);
    }


    public static <T> Ret ok(T data) {
        // 这部分错误码code需要放到拦截器中，service中的http请求会报错 zhaoxk 2023/12/28 19:29
//        RequestInfo requestInfo = RequestContext.getRequestInfo();
//        requestInfo.setErrCode(ErrCodeConts.OK);

        Ret<T> ret = new Ret<>();
        ret.setCode(ErrCodeConts.OK);
        ret.setMsg(ErrCodeConts.OK_MSG);
        if (null != data) {
            ret.setData(data);
        }
        return ret;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCause() {
        return cause;
    }

    public void setCause(String cause) {
        this.cause = cause;
    }
}
